#include "srkrt_method.h"
#include "srkrtDynamicList.h"

void srkrt_allowed_moves(Surakarta game, List* list) {
	Move move;
	bool captureIsPossible;
	int sens;
	int i, j;
	int k, l;


	for ( i = 0 ; i < 6 ; i++ ) {
		for ( j = 0 ; j < 6 ; j++ ) {
			move.xi = i;
			move.yi = j;
			/* si on trouve un pion qui appartient au jour dont c'est le tour de jeu */
			if ( game.board[i][j] == game.toPlay ) {
				
				/* on liste les positions sans prises autour du pion */
				for ( k = i-1 ; k < i+2 ; k++ ) {
					for ( l = j-1 ; l <j+2 ; l++ ) {
						/* si on ne sort pas du plateau */
						if ( (k > 0) && (k < 6) && (l > 0 ) && (l < 6 ) ) {
							/* si la case est libre */
							if ( game.board[k][l] == VIDE ) {
								/* on remplit la structure Move */
								move.xf = k;
								move.yf = l;
								move.capture = false;
								
								/* on l'ajoute à la liste */
								list_add(list, move);
							}
						}
					}
				}
				
				/* on liste les positions suites à des prises */
				for ( sens = UP ; sens <= RIGHT ; sens++ ) {	
					captureIsPossible = false;
					srkrt_go_loop(game, &move, &sens, &captureIsPossible);
					
					if ( captureIsPossible ) {
						/* on ajoute a la liste */
						move.capture = true;
						list_add(list, move);
					}
				}
			}
		}
	}
	
	
	
}

void srkrt_go_loop(Surakarta game, Move* move, int *sens, bool *captureIsPossible) {
	int loopNumber = 0;
	
	/* initialisation du point d'arrivé */
	move->xf = move->xi;
	move->yf = move->yi;
	
	/* tant qu'on n'a pas trouvé le point d'arrét */
	while ( (game.board[move->xf][move->yf] == VIDE) && (loopNumber < 5) ) {
		/* on avance d'une case */
		one_square_move(game, sens, move, &loopNumber);
	}
	
	/* si on a pris au moins une boucle, la capture est possible */
	if ( !loopNumber ) {
		*captureIsPossible = true;
	}
	
	
}

/* change la position si on prend une boucle */
void srkrt_loop_arrived(Surakarta game, Move *move, int* sens) {
	int tmp;
	
	/* si on est dans la boucle supérieure gauche ou inférieure droite */
	if ( abs(move->xf - move->yf) <= 2 ) {
		/* on inverse les coordonnées */
		tmp = move->xf;
		move->xf = move->yf;
		move->yf = tmp;
		
		/* changement du sens */
		if ( move->xf == 0 ) {
			*sens = RIGHT;
		} else if ( move->xf == 5 ) {
			*sens = LEFT;
		} else if ( move->yf == 0 ) {
			*sens = DOWN;
		} else {
			*sens = UP;
		}
	} else { /* si on est dans la boucle supérieure droite ou inférieure gauche */
		/* calcul des nouvelles coordonnées */
		move->xf = 5 - move->yi;
		move->yf = 5 - move->xi;
		
		/* changement du sens */
		if ( move->xf == 0 ) {
			*sens = LEFT;
		} else if ( move->xf == 5 ) {
			*sens = RIGHT;
		} else if ( move->yf == 0 ) {
			*sens = UP;
		} else {
			*sens = DOWN;
		}
	}
}

/* one_square_move calcule la prochaine case a prendre */
void one_square_move(Surakarta game, int* sens, Move *move, int *loopNumber) {
	switch (*sens) {
		case LEFT:
			/* si on peut entrer dans une boucle */
			if ( move->xf == 0 ) {
				srkrt_loop_arrived(game, move, sens);
				(*loopNumber)++;
			} else {	
				(move->xf)--;
			}
			break;
		case RIGHT:
			/* si on peut entrer dans une boucle */
			if ( move->xf == 5 ) {
				srkrt_loop_arrived(game, move, sens);
				(*loopNumber)++;
				
			} else {
				(move->xf)++;
			}
			break;
		case UP:
			/* si on peut entrer dans une boucle */
			if ( move->yf == 0 ) {
				srkrt_loop_arrived(game, move, sens);
				(*loopNumber)++;
				
			} else {
				(move->yf)++;
			}
			break;
		case DOWN:
			/* si on peut entrer dans une boucle */
			if ( move->xf == 5 ) {
				srkrt_loop_arrived(game, move, sens);
				(*loopNumber)++;
				
			} else {
				(move->yf)--;
			}
			break;
		default:
			fprintf(stderr, "Erreur dans one_square_move : unmatched value\n");
			break;
	}
}

bool srkrt_is_allowed(Surakarta game, Move action, List* l) {
	/* juste utiliser les fonctions de DynamicList */
	return(apply_function_to_list(&p_is_present, l, action));
}